home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / CodeWarrior Lite / Metrowerks C⁄C++ Lite / Libraries / Runtime / Runtime PPC / Sources / ptmf.s < prev    next >
Encoding:
Text File  |  1994-06-19  |  4.1 KB  |  189 lines  |  [TEXT/MPS ]

  1. #    ptmf.s    -    pointer-to-member-function support for Metrowerks C++ for PowerPC
  2. #
  3. #    Copyright © 1993 metrowerks inc.  All Rights Reserved.
  4. #
  5. #
  6. #    THEORY OF OPERATION
  7. #
  8. #    A pointer-to-member-function (PTMF) is represented as a 3-word struct:
  9. #
  10. #        +-----------------------------+            +-----------------------------+
  11. #        |        'this' delta          |            |        'this' delta          |
  12. #        |-----------------------------|         |-----------------------------|
  13. #        |            -1                  |            |         vtbl index           |
  14. #        |-----------------------------|         |-----------------------------|
  15. #        |        function pointer      |            |         vptr offset          |
  16. #        +-----------------------------+            +-----------------------------+
  17. #
  18. #
  19. #    BUILD INSTRUCTIONS
  20. #
  21. #    To assemble this file:
  22. #
  23. #        ppcasm ptmf.s -o ptmf.o
  24. #
  25. #    The object file runtime.o can be added directly to any CodeWarrior™ project.
  26. #
  27.  
  28.         dialect    powerpc
  29.  
  30. #
  31. #    Assembler Equates
  32. #
  33. cr0        equ        0
  34. cr1        equ        1
  35. cr2        equ        2
  36. cr3        equ        3
  37. cr4        equ        4
  38. cr5        equ        5
  39. cr6        equ        6
  40. cr7        equ        7
  41.  
  42. #
  43. #    PTMF Equates
  44. #
  45. this_delta        equ        0
  46. vtbl_index        equ        4
  47. vptr_offset        equ        8
  48.  
  49.  
  50. #
  51. #    Public Data
  52. #
  53.         csect    __ptmf_null{RO}
  54.         export    __ptmf_null{RO}
  55.         dc.l    0, 0, 0
  56.         
  57.  
  58. #    __ptmf_test    -    test pointer-to-member-function for null
  59. #
  60. #    R3 contains the PTMF. If it is null, we return 0; else we return 1.
  61. #
  62.         csect    .__ptmf_test{PR}
  63.         export    .__ptmf_test{PR}
  64.         lwz        r5,this_delta(r3)
  65.         lwz        r6,vtbl_index(r3)
  66.         lwz        r7,vptr_offset(r3)
  67.         li        r3,1
  68.         cmpi    cr0,r5,0
  69.         cmpi    cr6,r6,0
  70.         cmpi    cr7,r7,0
  71.         bnelr    cr0
  72.         bnelr    cr6
  73.         bnelr    cr7
  74.         li        r3,0
  75.         blr
  76.         
  77.  
  78. #    __ptmf_cmpr    -    compare two pointer-to-member-functions
  79. #
  80. #    R3 and R4 contain the PTMFs. If equal, we return 0; else we return 1.
  81. #
  82.         csect    .__ptmf_cmpr{PR}
  83.         export    .__ptmf_cmpr{PR}
  84.         lwz        r5,this_delta(r3)
  85.         lwz        r6,this_delta(r4)
  86.         lwz        r7,vtbl_index(r3)
  87.         lwz        r8,vtbl_index(r4)
  88.         lwz        r9,vptr_offset(r3)
  89.         lwz        r10,vptr_offset(r4)
  90.         li        r3,1
  91.         cmp        cr0,r5,r6
  92.         cmp        cr6,r7,r8
  93.         cmp        cr7,r9,r10
  94.         bnelr    cr0
  95.         bnelr    cr6
  96.         bnelr    cr7
  97.         li        r3,0
  98.         blr
  99.  
  100.  
  101. #    __ptmf_call        -    call pointer-to-member-function
  102. #
  103. #    R12 contains the PTMF. R3 contains 'this'.
  104. #
  105.         csect    .__ptmf_call{GL}
  106.         export    .__ptmf_call{GL}
  107.         lwz        r0,this_delta(r12)
  108.         lwz        r11,vtbl_index(r12)
  109.         lwz        r12,vptr_offset(r12)    #    function pointer if not virtual
  110.         cmpi    cr0,r11,0
  111.         add        r3,r3,r0                #    adjust 'this'
  112.         blt        cr0,@1
  113.         lwzx    r12,r3,12                #    get vptr
  114.         add        r12,r12,r11                #    point to vtbl entry
  115.         lwz        r0,4(r12)                #    get 'this' delta
  116.         lwz        r12,0(r12)                #    get function pointer
  117.         add        r3,r3,r0                #    adjust 'this' again
  118. @1        lwz        r0,0(r12)
  119.         stw        RTOC,20(SP)
  120.         mtctr    r0
  121.         lwz        RTOC,4(r12)
  122.         bctr
  123.  
  124.  
  125. #    __ptmf_call4    -    call pointer-to-member-function, 'this' in R4
  126. #
  127. #    R12 contains the PTMF. R4 contains 'this'.
  128. #
  129.         csect    .__ptmf_call4{GL}
  130.         export    .__ptmf_call4{GL}
  131.         lwz        r0,this_delta(r12)
  132.         lwz        r11,vtbl_index(r12)
  133.         lwz        r12,vptr_offset(r12)    #    function pointer if not virtual
  134.         cmpi    cr0,r11,0
  135.         add        r4,r4,r0                #    adjust 'this'
  136.         blt        cr0,@1
  137.         lwzx    r12,r4,12                #    get vptr
  138.         add        r12,r12,r11                #    point to vtbl entry
  139.         lwz        r0,4(r12)                #    get 'this' delta
  140.         lwz        r12,0(r12)                #    get function pointer
  141.         add        r4,r4,r0                #    adjust 'this' again
  142. @1        lwz        r0,0(r12)
  143.         stw        RTOC,20(SP)
  144.         mtctr    r0
  145.         lwz        RTOC,4(r12)
  146.         bctr
  147.  
  148.  
  149. #    __ptmf_scall    -    call pointer-to-member-function
  150. #
  151. #    This is used when we know the class tree uses single inheritance only.
  152. #    R12 contains the PTMF. R3 contains 'this'.
  153. #
  154. #
  155.         csect    .__ptmf_scall{GL}
  156.         export    .__ptmf_scall{GL}
  157.         lwz        r11,vtbl_index(r12)
  158.         lwz        r12,vptr_offset(r12)    #    function pointer if not virtual
  159.         cmpi    cr0,r11,0
  160.         blt        cr0,@1
  161.         lwzx    r12,r3,12                #    get vptr
  162.         lwzx    r12,r12,r11                #    get function pointer
  163. @1        lwz        r0,0(r12)
  164.         stw        RTOC,20(SP)
  165.         mtctr    r0
  166.         lwz        RTOC,4(r12)
  167.         bctr
  168.  
  169.  
  170. #    __ptmf_scall4    -    call pointer-to-member-function
  171. #
  172. #    This is used when we know the class tree uses single inheritance only.
  173. #    R12 contains the PTMF. R4 contains 'this'.
  174. #
  175. #
  176.         csect    .__ptmf_scall4{GL}
  177.         export    .__ptmf_scall4{GL}
  178.         lwz        r11,vtbl_index(r12)
  179.         lwz        r12,vptr_offset(r12)    #    function pointer if not virtual
  180.         cmpi    cr0,r11,0
  181.         blt        cr0,@1
  182.         lwzx    r12,r4,12                #    get vptr
  183.         lwzx    r12,r12,r11                #    get function pointer
  184. @1        lwz        r0,0(r12)
  185.         stw        RTOC,20(SP)
  186.         mtctr    r0
  187.         lwz        RTOC,4(r12)
  188.         bctr
  189.